package my.design.mediator;

import java.util.HashMap;

/**
 * @author zp
 * @version 1.0
 * @description: 具体的中介者类
 * @date 2022/10/27 19:07
 *
 * 中介者模式所涉及到的角色有：
 *
 * 1、抽象中介者角色（Mediator）：定义一个接口用于与各同事对象之间进行通信，其中主要方法是一个（或多个）事件方法。
 * 2、具体中介者角色（ConcreteMediator）：实现抽象中介者中所声明的事件方法。具体中介者维持了对各个具体同事类对象的引用，
 *      并负责具体的协调各个同事对象的交互关系。
 * 3、抽象同事类角色（Colleague）：定义各个同事类对象共有的方法，并声明了一些抽象方法供子类实现，同时他维持了一个对抽象中介者类的引用，
 *      其子类可以通过该引用进行通讯。同事对象只知道中介者，而不知道其余的同事对象。
 * 4、具体同事类角色（ConcreteColleague）：所有的具体同事类均从抽象同事类继承而来。实现自己的业务，
 *      在需要与其他同事通信的时候，就与持有的中介者通信，中介者会负责与其他的同时交互。
 *
 * 一、核心：
 * 1、如果一个对象中对象之间的联系呈现为网状结构，对象之间存在大量多对多的关系，将导致关系极其复杂，这些对象被称为“同事对象”.
 * 2、我们可以引入一个中介者对象，使各个同事对象只跟中介者对象打交道，将复杂的网络结构化解为星形结构。
 * 二、中介者模式（Mediator）优缺点
 * 中介者模式是一种行为型设计模式，其主要优点如下：
 * 1、使用中介者模式可以把对个同事对象之间的交互封装到中介者对象里面，从而使得同事对象之间松散耦合。
 * 2、中介者模式可以将原先多对多的同事对象关系变成中介者对象一对多同事对象的关系，这样会让对象之间的关系更容易理解、实现和扩展，将原本难以理解的网状结构换成相对接单的星状结构。
 * 3、同事对象之间的交互都被封装到中介者对象里面集中管理，集中了控制交互。当交互发生改变时，着重修改的是中介者对象。当需要扩展中介者对象时，其他同事对象不需要做修改。（可以独立地改变和复用各个同事类和中介者。）
 * 4、可以减少子类的生成。
 * 缺点：
 * 1、过度集中化，这是中介者模式潜在的缺点。如果同事对象多了，交互也复杂了。那么这些交互全部集中到中介者对象中（在具体中介中包含了大量的同事类之间的交互细节），会导致中介者对象十分臃肿（非常复杂），难以管理和维护。
 * 适用环境：
 * 1、系统中对象之间存在复杂的引用关系，系统结构混乱难以理解。
 * 2、一个对象由于引用了其他很多对象并且直接和这些对象进行通信，导致难以复用该对象。
 * 3、想通过一个中间类来封装多个类中的行为，而又不想生成太多的子类。
 *
 *
 */
public class ConcreteMediator extends Mediator {
    //集合，放入所有的同事对象
    private HashMap<String, Colleague> colleagueMap;
    private HashMap<String, String> interMap;

    public ConcreteMediator() {
        colleagueMap = new HashMap<String, Colleague>();
        interMap = new HashMap<String, String>();
    }

    @Override
    public void register(String colleagueName, Colleague colleague) {
        colleagueMap.put(colleagueName, colleague);

        if (colleague instanceof Alarm) {
            interMap.put("Alarm", colleagueName);
        } else if (colleague instanceof CoffeeMachine) {
            interMap.put("CoffeeMachine", colleagueName);
        } else if (colleague instanceof TV) {
            interMap.put("TV", colleagueName);
        } else if (colleague instanceof Curtains) {
            interMap.put("Curtains", colleagueName);
        }

    }

    //具体中介者的核心方法
    //1. 根据得到消息，完成对应任务
    //2. 中介者在这个方法，协调各个具体的同事对象，完成任务
    @Override
    public void getMessage(int stateChange, String colleagueName) {

        //处理闹钟发出的消息
        if (colleagueMap.get(colleagueName) instanceof Alarm) {
            if (stateChange == 0) {
                ((CoffeeMachine) (colleagueMap.get(interMap
                        .get("CoffeeMachine")))).startCoffee();
                ((TV) (colleagueMap.get(interMap.get("TV")))).startTv();
            } else if (stateChange == 1) {
                ((TV) (colleagueMap.get(interMap.get("TV")))).stopTv();
            }

        } else if (colleagueMap.get(colleagueName) instanceof CoffeeMachine) {
            ((Curtains) (colleagueMap.get(interMap.get("Curtains"))))
                    .upCurtains();

        } else if (colleagueMap.get(colleagueName) instanceof TV) {//如果TV发现消息

        } else if (colleagueMap.get(colleagueName) instanceof Curtains) {
            //如果是以窗帘发出的消息，这里处理...
        }

    }

    @Override
    public void sendMessage() {

    }

}

